﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// using static System.Net.Mime.MediaTypeNames; // 未使用的 using 语句
// using System.Xml.Linq; // 未使用的 using 语句
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
// using Autodesk.Revit.UI.Selection; // 当前未使用
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
// using Application = Autodesk.Revit.ApplicationServices.Application; // 如果需要，显式限定
using RevitProject.SpaceManager.Views;
using System.Windows;
using RevitProject.Helper;
using RevitProject.SpaceManager.ViewModel;
using RevitProject.SpaceManager.Factory; // Context Helper 至关重要

namespace RevitProject.SpaceManager
{
    /// <summary>
    /// 空间管理器的外部命令入口点。
    /// </summary>
    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    public class SpaceManagerCmd : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIApplication uiApp = null;
            Document doc = null;
            
            try
            {
                uiApp = commandData.Application;
                if (uiApp == null)
                {
                    message = "无法获取 Revit Application 对象。";
                    return Result.Failed;
                }
                doc = uiApp.ActiveUIDocument?.Document;
                if (doc == null)
                {
                    message = "无法获取活动的 Revit Document 对象。请打开一个项目。";
                    TaskDialog.Show("错误", message);
                    return Result.Cancelled;
                }


                // 初始化 RevitContextHelper（对于无模式 UI 交互至关重要）
                // 多次调用 Initialize 是安全的，它内部有检查。
                RevitContextHelper.Initialize(uiApp);
                var tran = new Transaction(doc);
                tran.Start("dd");


                ShareFactory.CreatePara(doc, new List<string>() { "空间类别" });


                tran.Commit();
                // 创建并显示无模式窗口
                // 将必要的 Revit 对象传递给 View/ViewModel
                var window = new SpaceManagerView(doc, uiApp); // 传递 Doc 和 UIApplication

                // 设置所有者窗口以确保在 Revit 内行为正常
                // 使用 System.Windows.Interop 帮助程序
                var helper = new System.Windows.Interop.WindowInteropHelper(window);
                helper.Owner = uiApp.MainWindowHandle; // Revit 主窗口句柄

                window.Show(); // 以无模式显示

                // 在窗口显示*之后*触发 ViewModel 中的初始数据加载
                // 确保它在 UI 线程上运行，以便安全地与 ViewModel 属性交互
                if (window.DataContext is SpaceManagerVm vm)
                {
                    // 使用 Dispatcher.InvokeAsync 以确保安全，特别是如果 LoadDataCommand
                    // 需要间接与 UI 元素交互或更新属性
                    // （这些属性在创建后立即绑定到 UI）
                    window.Dispatcher.InvokeAsync(async () =>
                    {
                        if (vm.LoadDataCommand.CanExecute(null))
                        {
                            await vm.LoadDataCommand.ExecuteAsync(null);
                        }
                    });
                }
                else
                {
                    // 注意：这里的字符串字面量是程序输出的一部分，通常不翻译，除非有特殊要求。
                    System.Diagnostics.Debug.WriteLine("Warning: DataContext is not SpaceManagerVm.");
                    TaskDialog.Show("警告", "无法加载初始数据，ViewModel 初始化失败。");
                }

                // 仅显示窗口不需要事务
                // 事务将通过 RevitContextHelper 在 ViewModel 命令内部处理
                
                return Result.Succeeded;
            }
            catch (Exception ex)
            {
                // 提供更详细的信息
                message = $"执行命令时发生意外错误: {ex.ToString()}";
                TaskDialog.Show("严重错误", message);
                return Result.Failed;
            }
        }
    }
}